/*
*	位运算
*/

//判定字符是否唯一
//https://leetcode.cn/problems/is-unique-lcci/submissions/
// class Solution {
// public:
//     bool isUnique(string astr) {
//         //鸽巢原理 只有26字母 长度为27必有一个字母出现两次
//         if(astr.size() > 26) return false;
//         int num = 0;
//         for(const auto& c:astr)
//         {
//             if((num>>(c-'a')) & 1) return false;
//             num |= (1<<(c-'a'));
//         }
//         return true;
//     }
// };


//丢失的数字
//https://leetcode.cn/problems/missing-number/submissions/
// class Solution {
// public:
//     int missingNumber(vector<int>& nums) {
//         int ret = 0;
//         int n = nums.size();
//         for(int i = 0;i<n;++i)
//             //如果这个数出现且下标也出现 则^后就抵消了 nums中的所有数与 0~n-1的所有数相 ^ 抵消出现过的数 
//             //当nums中没有出现 i 数 则数会被异或存入ret中 最终 与 n异或就可以消除数组中出现的所有数 留下未出现的数
//             ret ^= nums[i]^i;
//         return ret^n;
//     }
// };


//两整数之和
//https://leetcode.cn/problems/sum-of-two-integers/submissions/
// class Solution {
// public:
//     int getSum(int a, int b) {
//         // ^得出不需要进位的二进制位
//         // &得出需要进位的二进制位
//         while (a && b)
//         {
//             int num = a ^ b;
//             a = (a & b) << 1; //进位
//             b = num;
//         }
//         return a == 0 ? b : a;
//     }
// };


//只出现一次的数字Ⅱ
//https://leetcode.cn/problems/single-number-ii/submissions/
// class Solution {
// public:
//     int singleNumber(vector<int>& nums) {
//         int ret = 0;
//         for(int i = 0;i<32;++i) //确定比特位
//         {
//             int sum = 0;
//             for(const int& n:nums) sum += ((n>>i)&1); //统计每个数第i个比特位为1的数量

//             //如果不能被 3 整除 则该位独数也有
//             if(sum%3) ret |= (1<<i);
//         }
//         return ret;
//     }
// };


//消失的两个数字
//https://leetcode.cn/problems/missing-two-lcci/submissions/
// class Solution {
// public:
//     vector<int> missingTwo(vector<int>& nums) {
//         int n = nums.size()+2;
//         unsigned int xorn = 0;
//         for(const auto& n:nums) xorn ^= n;
//         //缺失两个数字 一定是 n个加2
//         for(int i = 1;i<=n;++i) xorn ^= i;
//         //此时xorn中存储的是两个缺失数字的异或和 两个数字的异或肯定有位数为0 也有位数为1 分组存放即可
//         int lowbit = xorn & (-xorn); //取最低位二进制位 表示两个数的不同二进制位 将数分为两组 相同的数会被抵消
//         vector<int> ret(2);
//         for(const auto& n:nums) ret[(n&lowbit)==0] ^= n;
//         for(int i = 1;i<=n;++i) ret[(i&lowbit)==0] ^= i;
//         return ret;
//     }
// };


//力扣: 191,338,461,136,260
